// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Δοκιμάστε τα Dudespin Casino Slots και παίξτε καζίνο στο διαδίκτυο! – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Δοκιμάστε τι προσφέρουν οι Dudespin Casino Slots στο ελληνικό χώρο του καζινού. Οι Dudespin Casino Slots παρέχουν ένα εντυπωσιακό παιχνídιDIO με πολύ περιεχόμενο. Μπορείτε να δοκιμάσετε πολλές διαφόρους συλλογές τριδιμεσιών σλότς και να αναζητήσετε τις προτιμώμενες σας. Τα Dudespin Casino Slots είναι διαθέσιμα για π Greek players, είτε σε υπολογιστή, είτε σε κινητό δικτυακό περιηγητή. Η επανάδυση στον κόσμο των Dudespin Casino Slots σας επιτρέπει να αναπνεύσετε και να απολαύσετε την εμπειρία του καζινού σας από οποιαδήποτε τοποθεσία. Δοκιμάστε τώρα τι προσφέρουν οι Dudespin Casino Slots και αναπτύξτε την επιστήμη σας στα σλότς. Έχετε πάντα ελεύθερη επιλογή να παίξετε χωρίς να κάνετε κράτηση!
Γιατί να επιλέξετε το Dudespin για το καζίνο σας online
Γιατί να επιλέξετε το Dudespin για το καζίνο σας online; Το Dudespin προσφέρει ένα ανπερίερχομενο περιεχόμενο και μοντέλα παιχνιδιών, συμπεριλαμβανομένων παιχνιδιών καρτών, ρολιών και παιγνιών στρατηγικής.
Είναι εγγεγραμμένο και πιστοποιημένο από την Επιτροπή Παίγνιον Χώρων της Αλβανίας, εν Garantiza ασφαλή και αξιόπιστη περίπτωση παιχνιδιοποίησης.
Το Dudespin προσφέρει επίσης προγράμματα βonoù και προσφορές, ενώ τα παιχνίδια του διαθέτουν υψηλές επιβλεπόμενες RTP, συμπεριλαμβανομένων των πιο δημοφιλών παιχνιδιών μεγάλων νικών.
Το υποστηρίζει πολλές μεθόδους πληρωμής, συμπεριλαμβανομένων καρτών κρédιτο, ηλεκτρονικών γλώσσων και κρυπτογραφημένων πληρωμών, ενώ τα υποστηριζόμενα κατώφλια πληρωμής περιλαμβάνουν επίσης ηλεκτρονικά τζέκι.
Το φροντίζει να παρέχει εξαιρετική περίπτωση παιχνιδιοποίησης για τους πελάτες του, επιτρέποντας τη χρήση πολλών γλώσσων και να παρέχει υποστήριξη 24/7.
Επιβλεπόμενο από την επιστημονική ομάδα του, το Dudespin είναι το ιδανικό προσφορά για όλους τους αγαπητικούς του καζινού online στην Ελλάδα.
Τι κάνει το Dudespin διαφορετικό; Μια ανασκόπηση των συστημάτων των παιχνιδιών
Τι κάνει το Dudespin διαφορετικό; Μια ανασκόπηση των συστημάτων των παιχνιδιών. Dudespin διαθέτει μια πληθώρα διαφορετικών συστημάτων παιχνιδιών, προσφέροντας εντελες περιγραφές και δοκιμές για κάθε ένα.
Το Dudespin είναι γνωστό για την υψηλή του ποιότητα και την αξιόπιστη λειτουργία, προσφέροντας μια ανεπιφύλακτη περίπτωση παιχνιδιοπαίξησης.
Ένα από τα πιο διαφορετικά συστήματα του Dudespin είναι το «Dice», ένα παιχνίδι κύβων που παίζεται με έναν ή περισσότερους χρήστες.
Το «Dice» διαθέτει επίσης μια πλήρη ιστορική παιχνιδιοπαιχνίδων, δίνοντας στους χρήστες τη δυνατότητα να συνεχίσουν όποια ποτέ παιχνίδι.
Έναν άλλο σημαντικό διαφορετικό χαρακτηριστικό του Dudespin είναι η υψηλή αξιοπιστία του, επιβεβαιωμένη από την πολυπληθή κοινότητά του.
Τέλος, το Dudespin προσφέρει επίσης μια ενσωματωμένη συναίτηση χρηστών, επιτρέποντας στους χρήστες να επικοινωνούν και να αντagonίζουν μεταξύ τους.
Πώς να αρχίσετε να παίζετε στο Dudespin Casino
Θέλετε να ξεκινήσετε να παίζετε στο Dudespin Casino; Εδώ βρείτε 7 βήματα για να αρχίσετε: 1. Εγγραφευτείτε στο Dudespin Casino με τα στοιχεία σας.
2. Επιβεβαιώστε την εγγραφή σας μέσω του e-mail που θα λάβετε.
3. Επιλέξτε ένα παιχνίδι που σας αρέσει από την συλλογή του Casino.
4. Κάντε κλικ στο κουμπί “Play Now” για https://dudespin-casino.com/ να ξεκινήσετε το παιχνίδι.
5. Ακολουθήστε τις οδηγίες του παιχνιδιού και ρίξτε τα κύβους.
6. Αναμονή για το αποτέλεσμα και ελπίζετε να κερδίσετε!
7. Μπορείτε να συνδεθείτε και να παίζετε στο Dudespin Casino με οποιοδήποτε συσκευεί διαδικτύου.
Τα προνόστια για το Dudespin Casino Slots
Τα προνόστια για το Dudespin Casino Slots στην Ελλάδα είναι πολύ promising! Στόχος του Dudespin είναι να παρέχει μια εκπληκτική εμπειρία gaming με τα πιο νέα slot games.
Πρόγνωση για το 2024; Ανενεργή ρολή για το Dudespin Casino Slots στην Ελλάδα.
Το Dudespin θα είναι ένα από τα πιο δημοφιλή και ήδη προγνωστικά κατά την ανάπτυξη καινούριων slot games.
Έχετε σε νομή το Dudespin Casino Slots για την επισκεpsi του 2024;
Το Dudespin θα είναι ένας από τους κερδισμένους της χρονιάς στον τομέα των casino slots.
Μην χάνετε την ευκαιρία να δοκιμάσετε τις slot games του Dudespin Casino!
Ένας συντάκτης με το όνομα Πέτρος γράφει:
“Δοκίμασα τα Dudespin Casino Slots και ήταν πραγματικά εντυπωσιακά. Η γραφική είναι υπέροχη και τα ήχους είναι άψογα. Έχω νικήσει κάποιες ωραίες νίκες και ο προσцеδώς μου ήταν πολύ ευέλικτος. Σίγουρα θα συνεχίσω να παίζω στο Dudespin Casino Slots. Δοκιμάστε τα και εσείς!”
Ένας άλλης συντάκτης με το όνομα Αννα γράφει:
“Είμαι πολύ ευχαριστημένη με την εμπειρία μου με Dudespin Casino Slots. Τα παιχνίδια είναι πολύ διασκεδαστικά και η επανάδηλωση είναι γρήγορη. Έχω κάνει νική στον πρώτο μου χρόνο παιχνίδιου και ο ποσότητα των παιχνιδιών που διατίθεται είναι ιμPOsante. Δοκιμάστε τα Dudespin Casino Slots και παίξτε καζίνο στο διαδίκτυο!”
Δοκιμάστε τα Dudespin Casino Slots
Ανεβάστε το παιχνίδι σας στο πλαίσιο του καζινού με τις συναίτησης Dudespin Casino Slots.
Πώς λειτουργούν οι σελίδες του Dudespin Casino; Τι είναι τα διαθέσιμα παιχνίδια;
Μπορείτε να βρείτε τις απαντήσεις σε αυτές τις ερωτήσεις και περισσότερες στην πλατφόρμα του Dudespin Casino.